//package com.jxj.study.util.ImageTests;
//
//import javax.swing.*;
//import java.awt.*;
//import java.awt.event.*;
//import java.awt.image.BufferedImage;
//import java.io.File;
//import javax.imageio.ImageIO;
//
//public class ImageViewerWithSelection extends JFrame {
//    private final JLabel imageLabel;
//    private BufferedImage originalImage;
//    private Image scaledImage;
//    private double scale = 1.0;
//    private static final double ZOOM_FACTOR = 0.1;
//    private static final double MIN_SCALE = 0.1;
//    private static final double MAX_SCALE = 5.0;
//
//    // 框选相关变量
//    private Point selectionStart;
//    private Rectangle selectionRect;
//    private boolean isSelecting = false;
//    private final Color selectionColor = new Color(0, 100, 255, 100);
//    private final BasicStroke selectionStroke = new BasicStroke(1.5f);
//
//    public ImageViewerWithSelection() {
//        setTitle("图片查看器 - 缩放与截图");
//        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//        setSize(1000, 700);
//        setLocationRelativeTo(null);
//
//        // 加载图片
//        try {
//            originalImage = ImageIO.read(new File("C:\\Users\\admin\\Desktop\\图片\\2G(6X@H6U]$_5E32}[6`O}R.png")); // 替换为你的图片路径
//            scaledImage = originalImage;
//        } catch (Exception e) {
//            e.printStackTrace();
//            JOptionPane.showMessageDialog(this, "无法加载图片", "错误", JOptionPane.ERROR_MESSAGE);
//            System.exit(1);
//        }
//
//        // 创建显示图片的JLabel
//        imageLabel = new JLabel(new ImageIcon(scaledImage)) {
//            @Override
//            protected void paintComponent(Graphics g) {
//                super.paintComponent(g);
//                // 绘制选择框
//                if (selectionRect != null) {
//                    Graphics2D g2d = (Graphics2D) g;
//                    g2d.setColor(selectionColor);
//                    g2d.fill(selectionRect);
//                    g2d.setStroke(selectionStroke);
//                    g2d.setColor(Color.BLUE);
//                    g2d.draw(selectionRect);
//                }
//            }
//        };
//        imageLabel.setHorizontalAlignment(JLabel.CENTER);
//        imageLabel.setVerticalAlignment(JLabel.CENTER);
//
//        // 添加鼠标滚轮监听器
//        imageLabel.addMouseWheelListener(e -> {
//            Point mousePos = e.getPoint();
//            Rectangle oldBounds = getImageBounds();
//
//            int rotation = e.getWheelRotation();
//            if (rotation < 0) { // 向上滚动 - 放大
//                scale = Math.min(scale + ZOOM_FACTOR, MAX_SCALE);
//            } else { // 向下滚动 - 缩小
//                scale = Math.max(scale - ZOOM_FACTOR, MIN_SCALE);
//            }
//
//            scaleImage();
//            Rectangle newBounds = getImageBounds();
//
//            double xRatio = (mousePos.x - oldBounds.x) / (double) oldBounds.width;
//            double yRatio = (mousePos.y - oldBounds.y) / (double) oldBounds.height;
//
//            adjustScrollPosition(xRatio, yRatio, newBounds);
//        });
//
//        // 添加鼠标监听器实现框选
//        imageLabel.addMouseListener(new MouseAdapter() {
//            @Override
//            public void mousePressed(MouseEvent e) {
//                if (SwingUtilities.isLeftMouseButton(e)) {
//                    selectionStart = e.getPoint();
//                    selectionRect = new Rectangle(selectionStart.x, selectionStart.y, 0, 0);
//                    isSelecting = true;
//                    imageLabel.repaint();
//                }
//            }
//
//            @Override
//            public void mouseReleased(MouseEvent e) {
//                if (SwingUtilities.isLeftMouseButton(e)) {
//                    isSelecting = false;
//                    // 如果选择框太小，则视为无效
//                    if (selectionRect.width < 5 || selectionRect.height < 5) {
//                        selectionRect = null;
//                    }
//                    imageLabel.repaint();
//                }
//            }
//        });
//
//        imageLabel.addMouseMotionListener(new MouseMotionAdapter() {
//            @Override
//            public void mouseDragged(MouseEvent e) {
//                if (isSelecting) {
//                    int x = Math.min(selectionStart.x, e.getX());
//                    int y = Math.min(selectionStart.y, e.getY());
//                    int width = Math.abs(e.getX() - selectionStart.x);
//                    int height = Math.abs(e.getY() - selectionStart.y);
//
//                    selectionRect = new Rectangle(x, y, width, height);
//                    imageLabel.repaint();
//                }
//            }
//        });
//
//        // 添加键盘监听器保存截图
//        imageLabel.setFocusable(true);
//        imageLabel.addKeyListener(new KeyAdapter() {
//            @Override
//            public void keyPressed(KeyEvent e) {
//                if (e.getKeyCode() == KeyEvent.VK_S && selectionRect != null) {
//                    saveSelectionAsImage();
//                } else if (e.getKeyCode() == KeyEvent.VK_ESCAPE) {
//                    selectionRect = null;
//                    imageLabel.repaint();
//                }
//            }
//        });
//
//        // 将JLabel放入JScrollPane以实现滚动
//        JScrollPane scrollPane = new JScrollPane(imageLabel);
//        getContentPane().add(scrollPane, BorderLayout.CENTER);
//
//        // 状态栏
//        JPanel statusPanel = new JPanel(new BorderLayout());
//        JLabel statusLabel = new JLabel("缩放比例: 100% | 拖拽鼠标选择区域，按S键保存截图");
//        statusLabel.setBorder(BorderFactory.createEtchedBorder());
//        statusPanel.add(statusLabel, BorderLayout.CENTER);
//
//        // 添加清除选择按钮
//        JButton clearButton = new JButton("清除选择");
//        clearButton.addActionListener(e -> {
//            selectionRect = null;
//            imageLabel.repaint();
//        });
//        statusPanel.add(clearButton, BorderLayout.EAST);
//
//        getContentPane().add(statusPanel, BorderLayout.SOUTH);
//    }
//
//    private void scaleImage() {
//        int newWidth = (int) (originalImage.getWidth() * scale);
//        int newHeight = (int) (originalImage.getHeight() * scale);
//        scaledImage = originalImage.getScaledInstance(newWidth, newHeight, Image.SCALE_SMOOTH);
//        imageLabel.setIcon(new ImageIcon(scaledImage));
//    }
//
//    private Rectangle getImageBounds() {
//        Rectangle bounds = new Rectangle();
//        Icon icon = imageLabel.getIcon();
//        if (icon != null) {
//            bounds.width = icon.getIconWidth();
//            bounds.height = icon.getIconHeight();
//
//            Dimension size = imageLabel.getSize();
//            bounds.x = (size.width - bounds.width) / 2;
//            bounds.y = (size.height - bounds.height) / 2;
//        }
//        return bounds;
//    }
//
//    private void adjustScrollPosition(double xRatio, double yRatio, Rectangle newBounds) {
//        JScrollPane scrollPane = (JScrollPane) imageLabel.getParent().getParent();
//
//        int newX = (int) (newBounds.x + xRatio * newBounds.width);
//        int newY = (int) (newBounds.y + yRatio * newBounds.height);
//
//        Rectangle viewRect = scrollPane.getViewport().getViewRect();
//        int centerX = newX - viewRect.width / 2;
//        int centerY = newY - viewRect.height / 2;
//
//        centerX = Math.max(0, Math.min(centerX, newBounds.width - viewRect.width));
//        centerY = Math.max(0, Math.min(centerY, newBounds.height - viewRect.height));
//
//        imageLabel.scrollRectToVisible(new Rectangle(centerX, centerY, viewRect.width, viewRect.height));
//    }
//
//    private void saveSelectionAsImage() {
//        try {
//            // 获取图片在JLabel中的实际位置
//            Rectangle imageBounds = getImageBounds();
//
//            // 计算选择框相对于原始图片的位置和尺寸
//            int x1 = (int) ((selectionRect.x - imageBounds.x) / scale);
//            int y1 = (int) ((selectionRect.y - imageBounds.y) / scale);
//            int width = (int) (selectionRect.width / scale);
//            int height = (int) (selectionRect.height / scale);
//
//            // 确保不超出图片范围
//            x1 = Math.max(0, Math.min(x1, originalImage.getWidth() - 1));
//            y1 = Math.max(0, Math.min(y1, originalImage.getHeight() - 1));
//            width = Math.max(1, Math.min(width, originalImage.getWidth() - x1));
//            height = Math.max(1, Math.min(height, originalImage.getHeight() - y1));
//
//            // 创建子图像
//            BufferedImage subImage = originalImage.getSubimage(x1, y1, width, height);
//
//            // 弹出保存对话框
//            JFileChooser fileChooser = new JFileChooser();
//            fileChooser.setDialogTitle("保存截图");
//            fileChooser.setSelectedFile(new File("screenshot.png"));
//
//            if (fileChooser.showSaveDialog(this) == JFileChooser.APPROVE_OPTION) {
//                File outputFile = fileChooser.getSelectedFile();
//                String format = outputFile.getName().toLowerCase().endsWith(".jpg") ? "jpg" : "png";
//                ImageIO.write(subImage, format, outputFile);
//                JOptionPane.showMessageDialog(this, "截图保存成功!", "成功", JOptionPane.INFORMATION_MESSAGE);
//            }
//        } catch (Exception e) {
//            e.printStackTrace();
//            JOptionPane.showMessageDialog(this, "保存截图失败: " + e.getMessage(), "错误", JOptionPane.ERROR_MESSAGE);
//        }
//    }
//
//    public static void main(String[] args) {
//        SwingUtilities.invokeLater(() -> {
//            ImageViewerWithSelection frame = new ImageViewerWithSelection();
//            frame.setVisible(true);
//        });
//    }
//}